<?php 
/**
 * 列表页控制器
 */
class ListController extends Controller{
    /**
     * 
     */
    public function index(){
    	//二级导航处理
    	$cid = Q('get.cid',0,'intval');
		
		//判断列表页二级导航是否还有子级，如果没有停留在当前分类
		$a = K('Cate')->where("pid={$cid}")->all();
		if(!$a){
			$info = K('Cate')->where("cid={$cid}")->find();
			$caid = $info['pid'];
		}else{
			$caid = $cid;
		}
    	//分类数据处理
        $cateData = K('Cate')->where("cid={$caid}")->all();
		foreach ($cateData as $k => $v) {
			//找到子集，重新压入数组
			$cateData[$k]['son'] = K('Cate')->where("pid={$v['cid']}")->all();
		}
		$this->assign('cateData',$cateData);
		
		
		//*********************************************************************
		//思路解析：
		//1、根据当前分类的cid,获得所有的子集cid  _cidGetGid---->_getSonCid
		//2、根据cid获得所有的商品gid
		//3、通过gid找到所有对应商品属性  _getAttr
		//4、分组后把相同的类型归结在一起
		//5、获得对应的类型属性名称，然后把对应的值也压入
		
    	//商品属性处理
    	$gids = $this->_cidGetGid($cid);
		//如果有商品的话
		if($gids){
			//3.通过gid找到所有对应商品属性
			$attr = $this->_getAttr($gids);
			$this->assign('attr',$attr);
			//3.获得筛选的param数组
			//param参数(数组),最后拿到这个数组进行筛选
			//如果param存在，则按照_变成数组,如果不存在用array_fill填充0
			$param = isset($_GET['param']) ? explode('_', $_GET['param']) : array_fill(0, count($attr), 0);
			$this->assign('param',$param);
			
			//4.进行通过param里面的id，要筛选取交集，获得最终的gid
			$finalGids = $this->_filterGid($param,$gids);
			
		}else{//如果当前分类下没有商品的时候
		//给个空数组就是为了在页面可以判断
			$finalGids = array();
		} 
		
		//判断得到的商品gid数组是否为空
		if(!$finalGids){
			$goodsData=array();
		}else{
			$goodsData = K('Goods')->where("gid in(" . implode(',', $finalGids) . ")")->all();
			//热门
			$hat = Q('get.hat',0,'intval');
			if($hat){
				$goodsData = K('Goods')->where("gid in(" . implode(',', $finalGids) . ")")->order("click DESC")->all();
			}
			//最新
			$new = Q('get.new',0,'intval');
			if($new){
				$goodsData = K('Goods')->where("gid in(" . implode(',', $finalGids) . ")")->order("addtime DESC")->all();
			}
			//价格
			$price = Q('get.price',0,'intval');
			if($price){
				$goodsData = K('Goods')->where("gid in(" . implode(',', $finalGids) . ")")->order("shopprice DESC")->all();
			}
		}
		
		
		
		$this->assign('goodsData',$goodsData);
		
		
        $this->display(); 
    }
	
	/**
	 * 通过param，获得商品gid
	 */
	public function _filterGid($param,$gids){
		$temp = array();
	    foreach ($param as $gtid) {
	    	//如果不是“不限”的时候，进行筛选
	    	if($gtid){
	    		$temp[] = M()->join('__goods_attr__ ga1 JOIN __goods_attr__ ga2 ON ga1.gtvalue=ga2.gtvalue')->where("ga1.gtid={$gtid}")->getField('ga2.goods_gid',true);
	    	}
	    }
		//如果不是全部“不限”,也就是点击了 “L” 或者 “红色”
		if($temp){
			//取交集过程
			$first = $temp[0];
			foreach ($temp as $k => $v) {
				//第一步，自己和自己取交集
				//第二步，自己和第二个$v取交集
				//第三步，上次取好的交集和第三个$v取交集
				$first = array_intersect($first, $v);
			}
			//因为filterGids有可能不是当前分类的商品，当前分类找到的gids和filterGids交集
			$finalGids = array_intersect($first, $gids);
			return $finalGids;
		}else{
			//当用户全部点“不限”的时候，也就是默认的时候
			//那么就返回当前的分类查找出来的gid
			return $gids;
		}
	}
	
	/**
	 * 通过gids找到商品的属性
	 */
	private function _getAttr($gids){
		//属性分组
		$attr = K('Goods_Attr')->where("goods_gid in(" . implode(',', $gids) . ")")->group('gtvalue')->all();
		$attrFirst = array();
		//把相同的类型归结在一起
		foreach ($attr as $v) {
			$attrFirst[$v['attribute_atid']][] = $v;
		}
		
		$attrSecond = array();
		//获得对应的类型属性名称，然后把对应的值也压入
		foreach ($attrFirst as $taid => $value) {
			$attrSecond[] = array(
				'name' => K('Attr')->where('atid=' . $taid)->getField('atname'),
				'value'=> $value
			);
		}
		return $attrSecond;
	}
	
	
	/**
	 * 通过分类的cid获得对应的所有的商品的gid
	 */
	private function _cidGetGid($cid){
		//获得所有分类数据
		$cateData = K('Cate')->all();
		//1.根据当前分类的cid,获得所有的子集cid
		$sonCids = $this->_getSonCid($cateData,$cid);
		$sonCids[] = $cid;
		
		//2.根据cid获得所有的商品gid
		$gids = K('Goods')->where('category_cid in(' . implode(',', $sonCids) . ')')->getField('gid',true);
		
		return $gids;
	}
	
	/**
	 * 获得当前分类所对应所有的子集cid
	 */
	private function _getSonCid($cateData,$cid){
		$temp = array();
		foreach ($cateData as $cate) {
			if($cate['pid'] == $cid){
				$temp[] = $cate['cid'];
				$temp = array_merge($temp,$this->_getSonCid($cateData, $cate['cid']));
			}
		}
		return $temp;
	}
	
	
	
	
	
	public function getfather($data,$cid){
		$temp = array();
	    foreach ($data as $k => $v) {
	    	if($v['cid']==$cid){
	    		$temp[] = $v;
	    	}
			$temp = array_merge($temp,$this->getfather($data,$v['pid']));
	    }
	}
	

	
	
	
	
	
	
	
	
 }
 
 
 
 
 
 
 
 
 
 
 



 ?>